{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第二十三课"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "knights = {\"a\": \"1\", \"b\": \"2\"}\n",
    "\n",
    "\n",
    "for path, code in knights.items():\n",
    "    if re.match(\"password\", code):\n",
    "        print(\"Found one!\", path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 空类能干啥？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "John Doe\n",
      "<__main__.Employee object at 0x000002011A60DDC0>\n"
     ]
    }
   ],
   "source": [
    "class Employee:\n",
    "    pass\n",
    "\n",
    "john = Employee()\n",
    "\n",
    "john.name = \"John Doe\"\n",
    "john.dept = \"computer lab\"\n",
    "john.salary = 1000\n",
    "\n",
    "print (john.name)\n",
    "\n",
    "print(john)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如何读文件？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: 'code.tx'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/87297722.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"code.tx\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'r'\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m     \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreadlines\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'code.tx'"
     ]
    }
   ],
   "source": [
    "with open(\"code.tx\", 'r') as f:\n",
    "    print(f.readlines())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "code_list = f.readlines()\n",
    "for k,v in dict(list(enumerate(code_list).items())):\n",
    "    k += 1\n",
    "    path = \"{}{}#{}\".format(path,file_name,\"#\" , k)\n",
    "\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<zip object at 0x000002011A4F7E40>\n",
      "[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]\n",
      "{}\n"
     ]
    }
   ],
   "source": [
    "a = [1, 2, 3, 4, 5]\n",
    "b = [\"a\", \"b\", \"c\", \"d\", \"e\"]\n",
    "\n",
    "d = zip(a, b)\n",
    "print(d)\n",
    "print(list(d))\n",
    "print(dict(d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def std_arg(arg):\n",
    "    print(arg)\n",
    "\n",
    "def pos_only_arg(arg, /):\n",
    "    print(arg)\n",
    "\n",
    "def kwd_only_arg(*, arg):\n",
    "    print(arg)\n",
    "\n",
    "def combined_example(pos_only, /, standard, *, kwd_only):\n",
    "    print(pos_only, standard, kwd_only)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n"
     ]
    }
   ],
   "source": [
    "std_arg(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n"
     ]
    },
    {
     "ename": "TypeError",
     "evalue": "pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/3792208563.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[0mpos_only_arg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mpos_only_arg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg'"
     ]
    }
   ],
   "source": [
    "pos_only_arg(2)\n",
    "pos_only_arg(arg=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "kwd_only_arg() takes 0 positional arguments but 1 was given",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/2789923978.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mkwd_only_arg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mkwd_only_arg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mTypeError\u001b[0m: kwd_only_arg() takes 0 positional arguments but 1 was given"
     ]
    }
   ],
   "source": [
    "kwd_only_arg(3)\n",
    "\n",
    "kwd_only_arg(arg=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 3 4\n"
     ]
    }
   ],
   "source": [
    "combined_example(2, 3, kwd_only=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 3 4\n"
     ]
    }
   ],
   "source": [
    "combined_example(2, standard=3, kwd_only=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/3199381224.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mcombined_example\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpos_only\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstandard\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwd_only\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m: combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only'"
     ]
    }
   ],
   "source": [
    "combined_example(pos_only=1, standard=3, kwd_only=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 列表操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "list.append(x) # 列表末尾加元素\n",
    "list.extend(iterable) # 将可迭代对象的元素扩展到列表中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 99, 2, 3, 4, 5]\n",
      "[100, 1, 99, 2, 3, 4, 5]\n"
     ]
    }
   ],
   "source": [
    "# 如何插入列表中指定位置？\n",
    "\n",
    "l =[ 1, 2, 3, 4, 5]\n",
    "\n",
    "l.insert(1, 99)\n",
    "print(l)\n",
    "\n",
    "l.insert(0, 100)\n",
    "print(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100, 1, 99, 3, 4, 5]\n"
     ]
    },
    {
     "ename": "ValueError",
     "evalue": "list.remove(x): x not in list",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/3794890269.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0ml\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mValueError\u001b[0m: list.remove(x): x not in list"
     ]
    }
   ],
   "source": [
    "# 如何删除列表元素\n",
    "\n",
    "print(l)\n",
    "l.remove(2) # 删除值为2的元素\n",
    "print(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100, 1, 99, 3, 4, 5]\n",
      "[100, 1, 3, 4, 5]\n"
     ]
    }
   ],
   "source": [
    "# 删除指定位置的元素\n",
    "print(l)\n",
    "\n",
    "l.pop(2) # 第二个位置是元素99\n",
    "print(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[]\n"
     ]
    }
   ],
   "source": [
    "# 如何清空列表\n",
    "\n",
    "l.clear()\n",
    "print(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}\n",
    "\n",
    "'apple' in basket"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'banana'}"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "basket1 = {'apple', 'orange', 'apple', 'pear'}\n",
    "\n",
    "(basket - basket1) # 差集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'apple', 'banana', 'orange', 'pear'}"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "basket | basket1 # 并集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'apple', 'orange', 'pear'}"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "basket & basket1  # 交集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'banana'}"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "basket1 ^ basket # 补集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['name', 'code', 'site']\n"
     ]
    }
   ],
   "source": [
    "# 字典\n",
    "dict1 = {'name': 'Runoob', 'code': 1, 'site': 'www.runoob.com'}\n",
    "\n",
    "print(list(dict1)) # 默认会将所有key转换为列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 ^ 2 # 按位异或"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "1<<2 # 左移运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 1\n",
      "1 2\n",
      "2 3\n",
      "3 4\n"
     ]
    }
   ],
   "source": [
    "# 循环中如何取出位置索引和值？\n",
    "\n",
    "l = [1, 2, 3, 4]\n",
    "for i, value in enumerate(l):\n",
    "    print(i, value)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "张三\n",
      "20\n"
     ]
    }
   ],
   "source": [
    "# 装饰器的作⽤就是调⽤函数变成调⽤变量，从不能调⽤私有化变量，直接⽤⼀个变量代替\n",
    "class Test1() :\n",
    "\n",
    "    def __init__(self, name, age):\n",
    "        self.name = name\n",
    "        self.__age = age # 私有变量\n",
    "    \n",
    "    @property\n",
    "    def age(self):\n",
    "        return self.__age\n",
    "    \n",
    "    @age.setter\n",
    "    def age(self, age):\n",
    "        self.__age = age\n",
    "\n",
    "test = Test1(\"张三\", 20)\n",
    "print(test.name)\n",
    "print(test.age)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 迭代器需要定义的函数\n",
    "* __next__()\n",
    "* __iter__()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "# 迭代器\n",
    "# \n",
    "\n",
    "class MyNumbers:\n",
    "    def __init__(self, data):\n",
    "        self.data = data\n",
    "        self.index = len(data)\n",
    "\n",
    "    def __iter__(self):\n",
    "        return self\n",
    "    \n",
    "    def __next__(self):\n",
    "        if self.index == 0:\n",
    "            raise StopIteration\n",
    "        self.index -= 1\n",
    "        return self.data[self.index]\n",
    "\n",
    "\n",
    "\n",
    "my_numbers = MyNumbers([1, 2, 3])\n",
    "next(my_numbers)\n",
    "\n",
    "for i in my_numbers:\n",
    "    print(i)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 生成器\n",
    "\n",
    "⽣成器 是⼀个⽤于创建迭代器的简单⽽强⼤的⼯具。 它们的写法类似于标准的函数，但当它们要返回数据时会使\n",
    "⽤ yield 语句。 每次在⽣成器上调⽤ next() 时，它会从上次离开的位置恢复执⾏（它会记住上次执⾏语句时\n",
    "的所有数据值）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "This is from my_gen()\n",
      "0\n",
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n"
     ]
    }
   ],
   "source": [
    "# 生成器\n",
    "\n",
    "# 通过函数定义实现生成器\n",
    "\n",
    "def my_gen():\n",
    "    print('This is from my_gen()')\n",
    "    for i in range(10):\n",
    "      yield i\n",
    "    \n",
    "for n in my_gen():\n",
    "   print(n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "2\n",
      "4\n",
      "6\n",
      "8\n",
      "10\n",
      "12\n",
      "14\n",
      "16\n",
      "18\n"
     ]
    }
   ],
   "source": [
    "# 生成器表达式\n",
    "\n",
    "# [x * 2 for x in range(10)] 将最外层的[] 修改为()即可定义好生成器\n",
    "# 也叫元组推到式,返回一个生成器对象\n",
    "# 与列表推导式一样，都是从左往右执行\n",
    "\n",
    "gen = (x * 2 for x in range(10))\n",
    "\n",
    "for i in gen:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'line', 'second', 'first'}\n"
     ]
    }
   ],
   "source": [
    "page = [\"first line\", \"second line\"]\n",
    "unique_words = set(word for line in page for word in line.split())\n",
    "\n",
    "print(unique_words)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 拆包与装包\n",
    "\n",
    "装包就是把未命名的参数放到元组中，把命名参数放到字典中\n",
    "\n",
    "拆包将⼀个结构中的数据拆分为多个单独变量中 *args **kwargs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 2, 3, 4, 5, 6)\n",
      "<class 'tuple'>\n",
      "拆包为单独的参数:  1 2 3 4 5 6 7\n",
      "未拆包： (1, 2, 3, 4, 5, 6, 7)\n",
      "拆包为单独参数:  d b c\n",
      "*kwargs type:  <class 'dict'>\n",
      "未拆包:  {'d': 1, 'b': 2, 'c': 3}\n",
      "*kwargs type:  <class 'dict'>\n"
     ]
    }
   ],
   "source": [
    "# 装包\n",
    "\n",
    "a = 1,2,3,4,5,6\n",
    "\n",
    "print(a)\n",
    "print(type(a))\n",
    "\n",
    "def my_func(*args):\n",
    "    print(\"拆包为单独的参数: \", *args) # 拆包为单独的参数\n",
    "    print(\"未拆包：\", args)\n",
    "\n",
    "my_func(1,2,3,4,5,6,7)\n",
    "\n",
    "\n",
    "def my_func1(**kwargs):\n",
    "    print(\"拆包为单独参数: \", *kwargs)\n",
    "    print(\"*kwargs type: \", type(kwargs))\n",
    "    print(\"未拆包: \", kwargs)\n",
    "    print(\"*kwargs type: \", type(kwargs))\n",
    "\n",
    "my_func1(d=1,b=2,c=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "拆包为单独参数:  d b\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def my_func2(**k):\n",
    "    print(\"拆包为单独参数: \", *k)\n",
    "    \n",
    "my_func2(d=1,b=2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 闭包\n",
    "在⼀个外函数中定义了⼀个内函数，内函数⾥运⽤了外函数的临时变量，并且外函数的返回值是内函数的引\n",
    "⽤。这样就构成了⼀个闭包。 ⼀般情况下，在我们认知当中，如果⼀个函数结束，函数的内部所有东⻄都会释放\n",
    "掉，还给内存，局部变量都会消失。但是闭包是⼀种特殊情况，如果外函数在结束的时候发现有⾃⼰的临时变量将\n",
    "来会在内部函数中⽤到，就把这个临时变量绑定给了内部函数，然后⾃⼰再结束"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "110\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def outer(a):\n",
    "    b = 10\n",
    "    def inner():\n",
    "        print(a + b)\n",
    "    return inner\n",
    "\n",
    "demo = outer(100)\n",
    "demo()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "考虑⼀种情况，我们必须编写多个函数只是为了接受不同数量的参数。\n",
    "\n",
    "``` python\n",
    "def add(a, b):\n",
    "  return a+b\n",
    "def add(a, b, c, d, e, f):\n",
    "  return a+b+c+d+e+f\n",
    "\n",
    "print(add(5,6)) #output 11\n",
    "print(add(5, 6, 1, 5, 2, 2)) #output 21\n",
    "```\n",
    "\n",
    "如何解决上述问题？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "15\n"
     ]
    }
   ],
   "source": [
    "# 直接传个列表进去？\n",
    "\n",
    "def  add(l):\n",
    "    return sum(l)\n",
    "\n",
    "print(add([1,2,3,4,5]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "15\n",
      "55\n",
      "Hello World\n"
     ]
    }
   ],
   "source": [
    "# 使用*args或者**kwargs\n",
    "\n",
    "# * 在 *args 是⼀个解包运算符，将传⼊的参数转换为 Python 元组\n",
    "\n",
    "# 在 **kwargs 中我们可以重命名 kwargs .\n",
    "# 重要的部分是 **（解包操作符），它应该在名称之前\n",
    "\n",
    "\n",
    "def add(*args):\n",
    "  print(sum(args))\n",
    "\n",
    "add()\n",
    "\n",
    "add(1,2,3,4,5)\n",
    "\n",
    "add(1,2,3,4,5,6,7,8,9,10)\n",
    "\n",
    "\n",
    "def concat(**kwargs):\n",
    "  print(\" \".join(kwargs.values()))\n",
    "\n",
    "concat(a=\"Hello\", b=\"World\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 装饰器\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "在函数执行前执行的额外操作\n",
      "Hello, World!\n",
      "在函数执行后执行的额外操作\n"
     ]
    }
   ],
   "source": [
    "def decorator(func):\n",
    "    def wrapper():\n",
    "        print(\"在函数执行前执行的额外操作\")\n",
    "        func()\n",
    "        print(\"在函数执行后执行的额外操作\")\n",
    "    return wrapper\n",
    "\n",
    "@decorator\n",
    "def hello():\n",
    "    print(\"Hello, World!\")\n",
    "\n",
    "# 调用被装饰的函数\n",
    "hello()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```python\n",
    "def decorator(variable):\n",
    "    def wrapper(func):\n",
    "        def inner_wrapper():\n",
    "            print(\"装饰器中的变量:\", variable)\n",
    "            func(variable)\n",
    "        return inner_wrapper\n",
    "    return wrapper\n",
    "\n",
    "@decorator(\"Hello\")\n",
    "def hello(variable):\n",
    "    print(\"Hello, World! 变量:\", variable)\n",
    "\n",
    "# 调用被装饰的函数\n",
    "hello()\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# lambda 表达式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "11\n"
     ]
    }
   ],
   "source": [
    "s = lambda a,b:a+b\n",
    "\n",
    "print(s(5,6))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n",
      "0\n"
     ]
    }
   ],
   "source": [
    "func = lambda x:x if x > 2 else 0\n",
    "\n",
    "print(func(10))\n",
    "print(func(1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[6, 7]\n"
     ]
    }
   ],
   "source": [
    "result = list(filter(lambda x: x > 5, [1, 2, 3, 4, 5, 6, 7]))\n",
    "\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "15\n"
     ]
    }
   ],
   "source": [
    "from functools import reduce\n",
    "\n",
    "result = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<map object at 0x000002011A527040>\n"
     ]
    }
   ],
   "source": [
    "result = map(lambda x: x * 2, [1, 2, 3, 4, 5])\n",
    "\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2, 4, 6, 8, 10]\n"
     ]
    }
   ],
   "source": [
    "print(list(result))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 错误捕获与处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "B\n",
      "C\n",
      "D\n",
      "========================\n",
      "B\n",
      "B\n",
      "B\n"
     ]
    }
   ],
   "source": [
    "# 错误捕获与处理\n",
    "\n",
    "class B(Exception):\n",
    "    pass\n",
    "\n",
    "class C(B):\n",
    "    pass\n",
    "\n",
    "class D(C):\n",
    "    pass\n",
    "\n",
    "for cls in [B, C, D]:\n",
    "    try:\n",
    "        raise cls()\n",
    "    except D:\n",
    "        print(\"D\")\n",
    "    except C:\n",
    "        print(\"C\")\n",
    "    except B:\n",
    "        print(\"B\")\n",
    "print(\"========================\")\n",
    "    \n",
    "for cls in [B, C, D]:\n",
    "    try:\n",
    "        raise cls()\n",
    "    except B:\n",
    "        print(\"B\")\n",
    "    except D:\n",
    "        print(\"D\")\n",
    "    except C:\n",
    "        print(\"C\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OS error: [Errno 2] No such file or directory: 'myfile'\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    f = open('myfile')\n",
    "    s = f.readline()\n",
    "    i = int(s.strip())\n",
    "except OSError as err:\n",
    "    print(\"OS error: {0}\".format(err))\n",
    "except ValueError:\n",
    "    print(\"Could not convert data to an integer.\")\n",
    "except BaseException as err:\n",
    "    print(\"Unexpected {err=}, {type(err)=} \")\n",
    "\n",
    "else:\n",
    "    print(\"f.readline() succeeded!\")\n",
    "    f.close()\n",
    "\n",
    "#使⽤ else ⼦句⽐向 try ⼦句添加额外的代码要好，可以避免意外捕获⾮ try ... except 语句保护的代码触发的异常。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "ename": "RuntimeError",
     "evalue": "Failed to connect",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mConnectionError\u001b[0m                           Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/3917429561.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m     \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      8\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mConnectionError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/3917429561.py\u001b[0m in \u001b[0;36mfunc\u001b[1;34m()\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m     \u001b[1;32mraise\u001b[0m \u001b[0mConnectionError\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mConnectionError\u001b[0m: ",
      "\nThe above exception was the direct cause of the following exception:\n",
      "\u001b[1;31mRuntimeError\u001b[0m                              Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/3917429561.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      7\u001b[0m     \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      8\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mConnectionError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m     \u001b[1;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Failed to connect\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mRuntimeError\u001b[0m: Failed to connect"
     ]
    }
   ],
   "source": [
    "# 异常调用链\n",
    "\n",
    "def func():\n",
    "    raise ConnectionError\n",
    "\n",
    "try:\n",
    "    func()\n",
    "except ConnectionError as err:\n",
    "    raise RuntimeError(\"Failed to connect\") from err"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 自定义异常\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 清理操作\n",
    "\n",
    "* try中如果有异常，则执行完finally后，重新触发异常\n",
    "* 如果 finally ⼦句中包含 break 、 continue 或 return 等语句，异常将不会被重新引发\n",
    "* 如果 finally ⼦句中包含 return 语句，则返回值来⾃ finally ⼦句的某个 return 语句的返回值，⽽不是来⾃ try ⼦句的 return 语句的返回值\n",
    "* 如果执⾏ try 语句时遇到 break, continue 或 return 语句，则 finally ⼦句在执⾏break 、 continue 或 return 语句之前执⾏\n",
    "* except 或 else ⼦句执⾏期间也会触发异常。 同样，该异常会在 finally ⼦句执⾏之后被重新触发"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Goodbye, World!\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/2962678332.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m     \u001b[1;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m     \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Goodbye, World!\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "#清理操作\n",
    "\n",
    "try:\n",
    "    raise KeyboardInterrupt\n",
    "finally:\n",
    "    print(\"Goodbye, World!\")\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "def bool_return():\n",
    "    try:\n",
    "        return True\n",
    "    finally:\n",
    "        return False\n",
    "\n",
    "bool_return()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: 'my_file.txt'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_15992/3766132879.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# 预定义清理操作\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"my_file.txt\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      4\u001b[0m     \u001b[1;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m         \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mend\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m''\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'my_file.txt'"
     ]
    }
   ],
   "source": [
    "# 预定义清理操作\n",
    "\n",
    "with open(\"my_file.txt\") as f:\n",
    "    for line in f:\n",
    "        print(line, end='')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 虚拟环境\n",
    "\n",
    "⽤于创建和管理虚拟环境的模块称为 venv 。 venv 通常会安装你可⽤的最新版本的 Python。如果您的系统上有\n",
    "多个版本的 Python，您可以通过运⾏ python3 或您想要的任何版本来选择特定的Python版本。\n",
    "\n",
    "```bash\n",
    "python3 -m venv tutorial-env\n",
    "source tutorial-env/bin/activate\n",
    "```\n",
    "\n",
    "\n"
   ]
  },
  {
   "attachments": {
    "1706339944114.jpg": {
     "image/jpeg": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 正则表达式\n",
    "\n",
    "![1706339944114.jpg](attachment:1706339944114.jpg))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "是否包含haha: True\n"
     ]
    }
   ],
   "source": [
    "a = \"haha\"\n",
    "\n",
    "print('是否包含haha: {}'.format(\"haha\" in a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['haha']\n"
     ]
    }
   ],
   "source": [
    "# 该函数实现了在字符串中找到正则表达式所匹配的所有⼦串，并组成⼀个列表返回\n",
    "findall = re.findall(\"haha\", a)\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['w', 'f']\n"
     ]
    }
   ],
   "source": [
    "findall = re.findall(\"(w|f)ood\", \"wood took foot food\")\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('wood', 'w'), ('food', 'f')]\n"
     ]
    }
   ],
   "source": [
    "# 捕获\n",
    "a = \"wood took foot food\"\n",
    "findall = re.findall(\"((w|f)ood)\", a)\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['wood', 'food']\n"
     ]
    }
   ],
   "source": [
    "# 希望将一个子模式作为整体进行分组，但又不需要在匹配结果中保留该分组的内容。这时可以使用非捕获组 (?:pattern)\n",
    "findall = re.findall(\"((?:w|f)ood)\", a)\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "c = \"uav, uuv, auv, udv, uov\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['a']\n"
     ]
    }
   ],
   "source": [
    "c = \"uav, uuv, auv, udv, uov\"\n",
    "findall = re.findall(\"u(a|b|c)v\", c)\n",
    "\n",
    "print(findall)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['uav']\n"
     ]
    }
   ],
   "source": [
    "\n",
    "findall = re.findall(\"u[abc]v\", c)\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['uuv', 'udv', 'uov']\n"
     ]
    }
   ],
   "source": [
    "findall = re.findall(\"u[^abc]v\", c)\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['a']\n"
     ]
    }
   ],
   "source": [
    "findall = re.findall(\"(?:u(a|c)v)\", c)\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['java', 'android', 'python']\n"
     ]
    }
   ],
   "source": [
    "c = \"java&*&23android##@@$%$python)\"\n",
    "findall = re.findall(\"([a-zA-Z]+)\", c)\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "贪婪与非贪婪\n",
    "\n",
    "![](images/1706342119582.jpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['java', 'andr', 'pyth']\n"
     ]
    }
   ],
   "source": [
    "# 非贪婪\n",
    "findall = re.findall(\"[a-zA-Z]{4,7}?\", c)\n",
    "print(findall)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 断言\n",
    "\n",
    "![](images/1706342248299.jpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python&Android&Java-888\n"
     ]
    }
   ],
   "source": [
    "# 匹配替换\n",
    "\n",
    "a = 'Python*Android*Java-888'\n",
    "# 把字符串中的 * 字符替换成 & 字符\n",
    "sub1 = re.sub('\\*', '&', a)\n",
    "print(sub1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python&Android*Java-888\n"
     ]
    }
   ],
   "source": [
    "# 把字符串中的第⼀个 * 字符替换成 & 字符\n",
    "sub2 = re.sub('\\*', '&', a, 1)\n",
    "print(sub2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python&Android&Java|888\n"
     ]
    }
   ],
   "source": [
    "# 还可以这样玩\n",
    "\n",
    "# 1、先定义⼀个函数\n",
    "def convert(value):\n",
    "    group = value.group()\n",
    "    if (group == '*'):\n",
    "      return '&'\n",
    "    elif (group == '-'):\n",
    "      return '|'\n",
    "# 第⼆个参数，要替换的字符可以为⼀个函数\n",
    "sub3 = re.sub('[\\*-]', convert, a)\n",
    "print(sub3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "re.match 尝试从字符串的起始位置匹配⼀个模式，如果不是起始位置匹配成功的话，match() 就返回 none\n",
    "\n",
    "re.search 扫描整个字符串并返回第⼀个成功的匹配"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "\n",
    "a = 'Python*Android*Java-888'\n",
    "# 使⽤ re.match\n",
    "match = re.match('[a-zA-Z]{4,7}', a)\n",
    "# group(0) 是⼀个完整的分组\n",
    "print(match.group(0))\n",
    "\n",
    "\n",
    "c = '123Python*Android*Java-888'\n",
    "match = re.match('[a-zA-Z]{4,7}', c)\n",
    "print(match)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<re.Match object; span=(9, 72), match='\"https://www.geektime.com/a8c49ef606e0e1f3ee28932>\n",
      "\"https://www.geektime.com/a8c49ef606e0e1f3ee28932usk89105e.jpg\"\n",
      "https://www.geektime.com/a8c49ef606e0e1f3ee28932usk89105e\n"
     ]
    }
   ],
   "source": [
    "a ='<img src=\"https://www.geektime.com/a8c49ef606e0e1f3ee28932usk89105e.jpg\">'\n",
    "p = \"\\\"(.*).\\w{3,}\\\"\"\n",
    "\n",
    "result = re.search(p, a)\n",
    "print(result)\n",
    "print(result.group(0))\n",
    "print(result.group(1))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<img src=\"https://www.geektime.com/a8c49ef606e0e1f3ee28932usk89105e.jpg\">\n",
      "img\n",
      "https://www.geektime.com/a8c49ef606e0e1f3ee28932usk89105e.jpg\n"
     ]
    }
   ],
   "source": [
    "result = re.search('<(.*) src=\"(.*)\">', a)\n",
    "print(result.group(0))\n",
    "print(result.group(1))\n",
    "print(result.group(2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['file-5.14.tar.gz',\n",
       " 'gmp-5.1.2.tar.xz',\n",
       " 'libpipeline-1.2.4.tar.gz',\n",
       " 'man-db-2.6.5.tar.xz',\n",
       " 'kbd-1.15.5.tar.gz',\n",
       " 'autoconf-2.69.tar.xz',\n",
       " 'automake-1.14.tar.xz']"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "loctions = [\n",
    "    \"ftp://ftp.astron.com/pub/file/file-5.14.tar.gz\",\n",
    "    \"ftp://ftp.gmplib.org/pub/gmp-5.1.2/gmp-5.1.2.tar.xz\",\n",
    "    \"ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2\",\n",
    "    \"http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/conglomeration//iana-etc/iana-etc-2.30.tar.bz2\",\n",
    "    \"http://anduin.linuxfromscratch.org/sources/other/udev-lfs-205-1.tar.bz2\",\n",
    "    \"http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.2.4.tar.gz\",\n",
    "    \"http://download.savannah.gnu.org/releases/man-db/man-db-2.6.5.tar.xz\",\n",
    "    \"http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf.tar.bz2\",\n",
    "    \"http://ftp.altlinux.org/pub/people/legion/kbd/kbd-1.15.5.tar.gz\",\n",
    "    \"http://mirror.hust.edu.cn/gnu/autoconf/autoconf-2.69.tar.xz\",\n",
    "    \"http://mirror.hust.edu.cn/gnu/automake/automake-1.14.tar.xz\",\n",
    "]\n",
    "\n",
    "[re.match('.*\\/(.*\\.(?:g|x)z)', x).group(1) for x in loctions if re.match('.*\\/(.*\\.(?:g|x)z)', x)   ]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# http请求"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests\n",
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://httpbin.org/ 200\n",
      "[]\n"
     ]
    }
   ],
   "source": [
    "url = \"http://httpbin.org\"\n",
    "r = requests.get(url, allow_redirects=True, verify=False)\n",
    "\n",
    "print(r.url, r.status_code)\n",
    "print(r.history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://httpbin.org/?key=value\n",
      "<!DOCTYPE html>\n",
      "<html lang=\"en\">\n",
      "\n",
      "<head>\n",
      "    <meta charset=\"UTF-8\">\n",
      "    <title>httpbin.org</title>\n",
      "    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700\"\n",
      "        rel=\"stylesheet\">\n",
      "    <link rel=\"stylesheet\" type=\"text/css\" href=\"/flasgger_static/swagger-ui.css\">\n",
      "    <link rel=\"icon\" type=\"image/png\" href=\"/static/favicon.ico\" sizes=\"64x64 32x32 16x16\" />\n",
      "    <style>\n",
      "        html {\n",
      "            box-sizing: border-box;\n",
      "            overflow: -moz-scrollbars-vertical;\n",
      "            overflow-y: scroll;\n",
      "        }\n",
      "\n",
      "        *,\n",
      "        *:before,\n",
      "        *:after {\n",
      "            box-sizing: inherit;\n",
      "        }\n",
      "\n",
      "        body {\n",
      "            margin: 0;\n",
      "            background: #fafafa;\n",
      "        }\n",
      "    </style>\n",
      "</head>\n",
      "\n",
      "<body>\n",
      "    <a href=\"https://github.com/requests/httpbin\" class=\"github-corner\" aria-label=\"View source on Github\">\n",
      "        <svg width=\"80\" height=\"80\" viewBox=\"0 0 250 250\" style=\"fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;\"\n",
      "            aria-hidden=\"true\">\n",
      "            <path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"></path>\n",
      "            <path d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\"\n",
      "                fill=\"currentColor\" style=\"transform-origin: 130px 106px;\" class=\"octo-arm\"></path>\n",
      "            <path d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\"\n",
      "                fill=\"currentColor\" class=\"octo-body\"></path>\n",
      "        </svg>\n",
      "    </a>\n",
      "    <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" style=\"position:absolute;width:0;height:0\">\n",
      "        <defs>\n",
      "            <symbol viewBox=\"0 0 20 20\" id=\"unlocked\">\n",
      "                <path d=\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z\"></path>\n",
      "            </symbol>\n",
      "\n",
      "            <symbol viewBox=\"0 0 20 20\" id=\"locked\">\n",
      "                <path d=\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z\"\n",
      "                />\n",
      "            </symbol>\n",
      "\n",
      "            <symbol viewBox=\"0 0 20 20\" id=\"close\">\n",
      "                <path d=\"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z\"\n",
      "                />\n",
      "            </symbol>\n",
      "\n",
      "            <symbol viewBox=\"0 0 20 20\" id=\"large-arrow\">\n",
      "                <path d=\"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z\"\n",
      "                />\n",
      "            </symbol>\n",
      "\n",
      "            <symbol viewBox=\"0 0 20 20\" id=\"large-arrow-down\">\n",
      "                <path d=\"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z\"\n",
      "                />\n",
      "            </symbol>\n",
      "\n",
      "\n",
      "            <symbol viewBox=\"0 0 24 24\" id=\"jump-to\">\n",
      "                <path d=\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z\" />\n",
      "            </symbol>\n",
      "\n",
      "            <symbol viewBox=\"0 0 24 24\" id=\"expand\">\n",
      "                <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\" />\n",
      "            </symbol>\n",
      "\n",
      "        </defs>\n",
      "    </svg>\n",
      "\n",
      "\n",
      "    <div id=\"swagger-ui\">\n",
      "        <div data-reactroot=\"\" class=\"swagger-ui\">\n",
      "            <div>\n",
      "                <div class=\"information-container wrapper\">\n",
      "                    <section class=\"block col-12\">\n",
      "                        <div class=\"info\">\n",
      "                            <hgroup class=\"main\">\n",
      "                                <h2 class=\"title\">httpbin.org\n",
      "                                    <small>\n",
      "                                        <pre class=\"version\">0.9.2</pre>\n",
      "                                    </small>\n",
      "                                </h2>\n",
      "                                <pre class=\"base-url\">[ Base URL: httpbin.org/ ]</pre>\n",
      "                            </hgroup>\n",
      "                            <div class=\"description\">\n",
      "                                <div class=\"markdown\">\n",
      "                                    <p>A simple HTTP Request &amp; Response Service.\n",
      "                                        <br>\n",
      "                                        <br>\n",
      "                                        <b>Run locally: </b>\n",
      "                                        <code>$ docker run -p 80:80 kennethreitz/httpbin</code>\n",
      "                                    </p>\n",
      "                                </div>\n",
      "                            </div>\n",
      "                            <div>\n",
      "                                <div>\n",
      "                                    <a href=\"https://kennethreitz.org\" target=\"_blank\">the developer - Website</a>\n",
      "                                </div>\n",
      "                                <a href=\"mailto:me@kennethreitz.org\">Send email to the developer</a>\n",
      "                            </div>\n",
      "                        </div>\n",
      "                        <!-- ADDS THE LOADER SPINNER -->\n",
      "                        <div class=\"loading-container\">\n",
      "                            <div class=\"loading\"></div>\n",
      "                        </div>\n",
      "\n",
      "                    </section>\n",
      "                </div>\n",
      "            </div>\n",
      "        </div>\n",
      "    </div>\n",
      "\n",
      "\n",
      "    <div class='swagger-ui'>\n",
      "        <div class=\"wrapper\">\n",
      "            <section class=\"clear\">\n",
      "                <span style=\"float: right;\">\n",
      "                    [Powered by\n",
      "                    <a target=\"_blank\" href=\"https://github.com/rochacbruno/flasgger\">Flasgger</a>]\n",
      "                    <br>\n",
      "                </span>\n",
      "            </section>\n",
      "        </div>\n",
      "    </div>\n",
      "\n",
      "\n",
      "\n",
      "    <script src=\"/flasgger_static/swagger-ui-bundle.js\"> </script>\n",
      "    <script src=\"/flasgger_static/swagger-ui-standalone-preset.js\"> </script>\n",
      "    <script src='/flasgger_static/lib/jquery.min.js' type='text/javascript'></script>\n",
      "    <script>\n",
      "\n",
      "        window.onload = function () {\n",
      "            \n",
      "\n",
      "            fetch(\"/spec.json\")\n",
      "                .then(function (response) {\n",
      "                    response.json()\n",
      "                        .then(function (json) {\n",
      "                            var current_protocol = window.location.protocol.slice(0, -1);\n",
      "                            if (json.schemes[0] != current_protocol) {\n",
      "                                // Switches scheme to the current in use\n",
      "                                var other_protocol = json.schemes[0];\n",
      "                                json.schemes[0] = current_protocol;\n",
      "                                json.schemes[1] = other_protocol;\n",
      "\n",
      "                            }\n",
      "                            json.host = window.location.host;  // sets the current host\n",
      "\n",
      "                            const ui = SwaggerUIBundle({\n",
      "                                spec: json,\n",
      "                                validatorUrl: null,\n",
      "                                dom_id: '#swagger-ui',\n",
      "                                deepLinking: true,\n",
      "                                jsonEditor: true,\n",
      "                                docExpansion: \"none\",\n",
      "                                apisSorter: \"alpha\",\n",
      "                                //operationsSorter: \"alpha\",\n",
      "                                presets: [\n",
      "                                    SwaggerUIBundle.presets.apis,\n",
      "                                    // yay ES6 modules ↘\n",
      "                                    Array.isArray(SwaggerUIStandalonePreset) ? SwaggerUIStandalonePreset : SwaggerUIStandalonePreset.default\n",
      "                                ],\n",
      "                                plugins: [\n",
      "                                    SwaggerUIBundle.plugins.DownloadUrl\n",
      "                                ],\n",
      "            \n",
      "            // layout: \"StandaloneLayout\"  // uncomment to enable the green top header\n",
      "        })\n",
      "\n",
      "        window.ui = ui\n",
      "\n",
      "        // uncomment to rename the top brand if layout is enabled\n",
      "        // $(\".topbar-wrapper .link span\").replaceWith(\"<span>httpbin</span>\");\n",
      "        })\n",
      "    })\n",
      "}\n",
      "    </script>  <div class='swagger-ui'>\n",
      "    <div class=\"wrapper\">\n",
      "        <section class=\"block col-12 block-desktop col-12-desktop\">\n",
      "            <div>\n",
      "\n",
      "                <h2>Other Utilities</h2>\n",
      "\n",
      "                <ul>\n",
      "                    <li>\n",
      "                        <a href=\"/forms/post\">HTML form</a> that posts to /post /forms/post</li>\n",
      "                </ul>\n",
      "\n",
      "                <br />\n",
      "                <br />\n",
      "            </div>\n",
      "        </section>\n",
      "    </div>\n",
      "</div>\n",
      "</body>\n",
      "\n",
      "</html>\n",
      "utf-8\n"
     ]
    }
   ],
   "source": [
    "payload = {'key': 'value'}\n",
    "\n",
    "r = requests.get(url, params=payload, verify=False)\n",
    "\n",
    "print(r.url)\n",
    "print(r.text)\n",
    "print(r.encoding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "    \"slideshow\": {\n",
      "        \"author\": \"Yours Truly\",\n",
      "        \"date\": \"date of publication\",\n",
      "        \"slides\": [\n",
      "            {\n",
      "                \"title\": \"Wake up to WonderWidgets!\",\n",
      "                \"type\": \"all\"\n",
      "            },\n",
      "            {\n",
      "                \"items\": [\n",
      "                    \"Why <em>WonderWidgets</em> are great\",\n",
      "                    \"Who <em>buys</em> WonderWidgets\"\n",
      "                ],\n",
      "                \"title\": \"Overview\",\n",
      "                \"type\": \"all\"\n",
      "            }\n",
      "        ],\n",
      "        \"title\": \"Sample Slide Show\"\n",
      "    }\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "url = \"http://httpbin.org/json\"\n",
    "r = requests.get(url, verify=False)\n",
    "print(json.dumps(r.json(), indent= 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<urllib3.response.HTTPResponse object at 0x000002037C400E20>\n",
      "b'{\\n  \"slideshow\": {\\n    \"author\": \"Yours Truly\", \\n    \"date\": \"date of publication\", \\n    \"slides\": [\\n      {\\n        \"title\": \"Wake up to WonderWidgets!\", \\n        \"type\": \"all\"\\n      }, \\n      {\\n        \"items\": [\\n          \"Why <em>WonderWidgets</em> are great\", \\n          \"Who <em>buys</em> WonderWidgets\"\\n        ], \\n        \"title\": \"Overview\", \\n        \"type\": \"all\"\\n      }\\n    ], \\n    \"title\": \"Sample Slide Show\"\\n  }\\n}\\n'\n"
     ]
    }
   ],
   "source": [
    "r = requests.get(url, verify=False, stream= True)\n",
    "\n",
    "print(r.raw)\n",
    "print(r.raw.read())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "  \"args\": {}, \n",
      "  \"data\": \"\", \n",
      "  \"files\": {}, \n",
      "  \"form\": {\n",
      "    \"key\": \"value\"\n",
      "  }, \n",
      "  \"headers\": {\n",
      "    \"Accept\": \"*/*\", \n",
      "    \"Accept-Encoding\": \"gzip, deflate, br\", \n",
      "    \"Content-Length\": \"9\", \n",
      "    \"Content-Type\": \"application/x-www-form-urlencoded\", \n",
      "    \"Host\": \"httpbin.org\", \n",
      "    \"User-Agent\": \"python-requests/2.26.0\", \n",
      "    \"X-Amzn-Trace-Id\": \"Root=1-65b4c9ad-354d55896fbad1856f1ff57d\"\n",
      "  }, \n",
      "  \"json\": null, \n",
      "  \"origin\": \"107.151.176.66\", \n",
      "  \"url\": \"http://httpbin.org/post\"\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "url = \"http://httpbin.org/post\"\n",
    "\n",
    "r = requests.post(url, data={'key': 'value'}, verify=False)\n",
    "\n",
    "print(r.text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "  \"args\": {}, \n",
      "  \"data\": \"\", \n",
      "  \"files\": {}, \n",
      "  \"form\": {\n",
      "    \"key\": \"value\"\n",
      "  }, \n",
      "  \"headers\": {\n",
      "    \"Accept\": \"*/*\", \n",
      "    \"Accept-Encoding\": \"gzip, deflate, br\", \n",
      "    \"Content-Length\": \"9\", \n",
      "    \"Content-Type\": \"application/x-www-form-urlencoded\", \n",
      "    \"Host\": \"httpbin.org\", \n",
      "    \"User-Agent\": \"python-requests/2.26.0\", \n",
      "    \"X-Amzn-Trace-Id\": \"Root=1-65b4ca51-742214fc30075f125412d3fd\"\n",
      "  }, \n",
      "  \"json\": null, \n",
      "  \"origin\": \"107.151.176.66\", \n",
      "  \"url\": \"http://httpbin.org/post\"\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "def curl(data, json):\n",
    "  url = \"http://httpbin.org/post\"\n",
    "  r = requests.post(url, data=data, json=json, verify=False)\n",
    "  print(r.text)\n",
    "\n",
    "payload = {'key': 'value'}\n",
    "curl(payload, None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "  \"args\": {}, \n",
      "  \"data\": \"{\\\"key\\\": \\\"value\\\"}\", \n",
      "  \"files\": {}, \n",
      "  \"form\": {}, \n",
      "  \"headers\": {\n",
      "    \"Accept\": \"*/*\", \n",
      "    \"Accept-Encoding\": \"gzip, deflate, br\", \n",
      "    \"Content-Length\": \"16\", \n",
      "    \"Content-Type\": \"application/json\", \n",
      "    \"Host\": \"httpbin.org\", \n",
      "    \"User-Agent\": \"python-requests/2.26.0\", \n",
      "    \"X-Amzn-Trace-Id\": \"Root=1-65b4ca65-3003c1e0544354403bd2bebd\"\n",
      "  }, \n",
      "  \"json\": {\n",
      "    \"key\": \"value\"\n",
      "  }, \n",
      "  \"origin\": \"107.151.176.66\", \n",
      "  \"url\": \"http://httpbin.org/post\"\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "json = {'key': 'value'}\n",
    "curl(None, json)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "  \"cookies\": {\n",
      "    \"gross_cookie\": \"blech\", \n",
      "    \"tasty_cookie\": \"yum\"\n",
      "  }\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "jar = requests.cookies.RequestsCookieJar()\n",
    "jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/')\n",
    "jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/cookies')\n",
    "\n",
    "url = \"http://httpbin.org/cookies\"\n",
    "r = requests.get(url, cookies=jar, verify=False)\n",
    "print(r.text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "  \"cookies\": {\n",
      "    \"gross_cookie\": \"blech\", \n",
      "    \"tasty_cookie\": \"yum\"\n",
      "  }\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "\n",
    "jar = requests.cookies.RequestsCookieJar()\n",
    "jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/')\n",
    "jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/cookies')\n",
    "\n",
    "url = \"http://httpbin.org/cookies\"\n",
    "r = requests.get(url, cookies=jar, verify=False, timeout=1)\n",
    "print(r.text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: mysql-connector in d:\\anaconda\\lib\\site-packages (2.2.9)\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install mysql-connector # jupyter lab中使用 !pip install xxx\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [],
   "source": [
    "import mysql.connector"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# python 多进程和多线程\n",
    "\n",
    "Linux进程有⽗进程、⼦进程，Windows的进程是平等关系\n",
    "\n",
    "进程是资源分配的最⼩单位，线程是CPU调度的最⼩单位\n",
    "\n",
    "⼀个标准的线程由线程ID，当前指令指针(PC)、寄存器集合和堆、栈组成"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==============================\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "i`m working\n",
      "i`m done\n",
      "finished\n"
     ]
    }
   ],
   "source": [
    "import threading\n",
    "import time\n",
    "\n",
    "def worker():\n",
    "    for i in range (10):\n",
    "        time.sleep(0.5)\n",
    "        print(\"i`m working\")\n",
    "        print(\"i`m done\")\n",
    "        if i > 10:\n",
    "            break\n",
    "    print(\"finished\")\n",
    "\n",
    "t = threading.Thread(target=worker, name='worker')\n",
    "\n",
    "\n",
    "t.start()\n",
    "\n",
    "print('='*30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i am working: worker1 8212\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "i am working: worker2 2732\n",
      "\n",
      "i am working: worker3 5932\n",
      "\n",
      "i am working: worker3 5932\n",
      "i am working: worker2 2732\n",
      "\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i am working: worker1 8212\n",
      "\n",
      "i am working: worker1 8212\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "i am working: worker2 2732\n",
      "i am working: worker3 5932\n",
      "\n",
      "\n",
      "i am working: worker2 2732\n",
      "i am working: worker3 5932\n",
      "\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i am working: worker1 8212\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "i am working: worker3 5932\n",
      "i am working: worker2 2732\n",
      "\n",
      "finished\n",
      "\n",
      "finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i am working: worker1 8212\n",
      "\n",
      "finished\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "def worker (f=sys.stdout):\n",
    "    t = threading.current_thread()\n",
    "    for i in range(5):\n",
    "        time.sleep(1)\n",
    "        print('i am working: {0} {1}\\n'.format( t.name, t.ident), file=f)\n",
    "    print(\"finished\", file=f)\n",
    "\n",
    "t1 = threading.Thread(target=worker, name='worker1')\n",
    "t2 = threading.Thread(target=worker, name='worker2', args=(sys.stderr,))\n",
    "t3 = threading.Thread(target=worker, name='worker3', args=(sys.stderr,))\n",
    "\n",
    "t1.start()\n",
    "t2.start()\n",
    "t3.start()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# daemon线程\n",
    "\n",
    "在Python中，守护线程（daemon thread）是一种特殊类型的线程，它在后台运行，并且不会阻止程序的退出。与常规线程（非守护线程）不同，守护线程的生命周期与主线程或其他非守护线程无关。\n",
    "\n",
    "当所有的非守护线程完成执行并退出时，程序会自动退出，而不管守护线程是否仍在运行。这意味着守护线程不会阻止程序的正常退出，即使它们尚未完成任务。\n",
    "\n",
    "要创建守护线程，可以使用threading.Thread类并将daemon参数设置为True"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "在Python中，线程的调度是由全局解释器锁（Global Interpreter Lock，GIL）控制的。GIL是一种机制，它确保在任何给定的时间点只有一个线程可以执行Python字节码，即使在多核系统上也是如此。这意味着Python中的多线程不能实现真正的并行执行。\n",
    "\n",
    "由于GIL的存在，Python的多线程并不能充分利用多核处理器的优势。尽管可以同时创建多个线程，但**在任何给定时刻只有一个线程能够运行，其他线程会被阻塞**。这导致在CPU密集型任务中，Python的多线程性能可能比单线程还要差。\n",
    "\n",
    "然而，Python的多线程在某些情况下仍然有其用武之地。例如，在I/O密集型任务中，如网络请求、文件操作等，由于大部分时间都花在等待外部资源的响应上，因此多线程可以充分利用等待时间，提高程序的效率。\n",
    "\n",
    "此外，Python中的多线程也提供了对并发编程的支持，使得编写并发代码更加简单。多线程可以用于处理并发的任务，实现任务的分配、协作和同步等操作。\n",
    "\n",
    "因此，虽然Python的线程不能实现真正的并行执行，并且在某些情况下可能会受到GIL的限制，但在I/O密集型任务和并发编程方面，Python的多线程仍然具有一定的用途。如果需要实现真正的并行计算，可以考虑使用多进程或其他语言提供的并发机制。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在Python解释器中，存在一个全局的数据结构（即解释器状态），它在多个线程之间共享。为了保护这个共享的数据结构，GIL被引入以确保在任何给定时刻只有一个线程可以访问和修改解释器状态\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "GIL的存在主要是因为Python的内存管理机制。Python使用引用计数来管理对象的内存，当一个对象的引用计数为0时，该对象将被回收。GIL可以简化引用计数的实现，因为在访问和修改引用计数时只有一个线程可以操作，从而避免了复杂的线程安全性问题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------------------------------------------------------------------------\n",
      "worker start <Thread(w0, started daemon 23956)>\n",
      "worker start <Thread(w1, started daemon 23952)>\n",
      "worker start <Thread(w2, started daemon 20772)>\n",
      "worker start <Thread(w3, started daemon 21648)>\n",
      "worker start worker start <Thread(w5, started daemon 4024)>\n",
      "<Thread(w4, started daemon 24340)>\n",
      "worker start <Thread(w6, started daemon 21168)>\n",
      "worker start <Thread(w7, started daemon 23456)>\n",
      "worker start <Thread(w8, started daemon 19180)>\n",
      "worker start <Thread(w9, started daemon 7268)>\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "released one lockerworker done\n",
      " <Thread(w0, started daemon 23956)>\n",
      "released one lockerworker done\n",
      " <Thread(w1, started daemon 23952)>\n",
      "[<_MainThread(MainThread, started 9612)>, <Thread(Thread-6, started daemon 2504)>, <Heartbeat(Thread-7, started daemon 20892)>, <ControlThread(Thread-5, started daemon 20744)>, <HistorySavingThread(IPythonHistorySavingThread, started 22296)>, <ParentPollerWindows(Thread-4, started daemon 23260)>, <Thread(w2, started daemon 20772)>, <Thread(w3, started daemon 21648)>, <Thread(w4, started daemon 24340)>, <Thread(w5, started daemon 4024)>, <Thread(w6, started daemon 21168)>, <Thread(w7, started daemon 23456)>, <Thread(w8, started daemon 19180)>, <Thread(w9, started daemon 7268)>]\n",
      "[<_MainThread(MainThread, started 9612)>, <Thread(Thread-6, started daemon 2504)>, <Heartbeat(Thread-7, started daemon 20892)>, <ControlThread(Thread-5, started daemon 20744)>, <HistorySavingThread(IPythonHistorySavingThread, started 22296)>, <ParentPollerWindows(Thread-4, started daemon 23260)>, <Thread(w2, started daemon 20772)>, <Thread(w3, started daemon 21648)>, <Thread(w4, started daemon 24340)>, <Thread(w5, started daemon 4024)>, <Thread(w6, started daemon 21168)>, <Thread(w7, started daemon 23456)>, <Thread(w8, started daemon 19180)>, <Thread(w9, started daemon 7268)>]\n",
      "released one lockerworker done\n",
      " <Thread(w2, started daemon 20772)>\n",
      "released one lockerworker done\n",
      " <Thread(w3, started daemon 21648)>\n",
      "released one lockerworker done\n",
      " <Thread(w5, started daemon 4024)>\n",
      "released one lockerworker done\n",
      " <Thread(w4, started daemon 24340)>\n",
      "released one locker\n",
      "worker done <Thread(w6, started daemon 21168)>\n",
      "released one lockerworker done\n",
      " <Thread(w7, started daemon 23456)>\n",
      "released one lockerworker done <Thread(w8, started daemon 19180)>\n",
      "\n",
      "released one lockerworker done\n",
      " <Thread(w9, started daemon 7268)>\n",
      "released one locker\n"
     ]
    },
    {
     "ename": "RuntimeError",
     "evalue": "release unlocked lock",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mRuntimeError\u001b[0m                              Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_20588/3577292541.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     17\u001b[0m     \u001b[0mcmd\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\">>>>>\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     18\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mcmd\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'r'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 19\u001b[1;33m         \u001b[0mlock\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrelease\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     20\u001b[0m         \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"released one locker\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     21\u001b[0m     \u001b[1;32melif\u001b[0m \u001b[0mcmd\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'q'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mRuntimeError\u001b[0m: release unlocked lock"
     ]
    }
   ],
   "source": [
    "import threading\n",
    "lock = threading.Lock()\n",
    "\n",
    "lock.acquire()\n",
    "\n",
    "print('---'*30)\n",
    "\n",
    "def worker (l):\n",
    "    print('worker start', threading.current_thread())\n",
    "    l.acquire()\n",
    "    print('worker done', threading.current_thread())\n",
    "\n",
    "for i in range(10):\n",
    "    threading.Thread(target=worker, name='w{}'.format(i), args=(lock,), daemon=True).start()\n",
    "\n",
    "while True:\n",
    "    cmd = input(\">>>>>\")\n",
    "    if cmd == 'r':\n",
    "        lock.release()\n",
    "        print(\"released one locker\")\n",
    "    elif cmd == 'q':\n",
    "        lock.release()\n",
    "        break\n",
    "    else:\n",
    "        print(threading.enumerate())\n",
    "        \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i finished my job. cups = 1000 i finished my job. cups = 1001 i finished my job. cups = 1002 \n",
      "i finished my job. cups = 1003 \n",
      "\n",
      "i finished my job. cups = 1004 \n",
      "\n",
      "i finished my job. cups = 1005 \n",
      "i finished my job. cups = 1006 i finished my job. cups = 1007 i finished my job. cups = 1008 \n",
      "\n",
      "i finished my job. cups = 1009 \n",
      "\n"
     ]
    }
   ],
   "source": [
    "import threading, time, logging\n",
    "\n",
    "FORMAT = \"%(asctime)s: %(threadName)s %(thread)d %(message)s\"\n",
    "logging.basicConfig(format=FORMAT, level=logging.INFO)\n",
    "\n",
    "cups = []\n",
    "\n",
    "def worker(count = 1000):\n",
    "    print(\"start worker\")\n",
    "    while True:\n",
    "        if len(cups) >= count:\n",
    "            break\n",
    "        time.sleep(0.0001)\n",
    "        cups.append(1)\n",
    "    print(\"i finished my job. cups = {} \".format(len(cups)))\n",
    "\n",
    "for i in range(1,11):\n",
    "    threading.Thread(target=worker, args=(1000,), name=\"{}\".format(i)).start()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i finished my job. cups = 1000\n",
      "i finished my job. cups = 1001\n",
      "i finished my job. cups = 1002\n",
      "i finished my job. cups = 1003\n",
      "\n",
      "\n",
      "\n",
      "\n",
      "i finished my job. cups = 1004\n",
      "i finished my job. cups = 1005\n",
      "i finished my job. cups = 1006\n",
      "i finished my job. cups = 1007\n",
      "\n",
      "\n",
      "i finished my job. cups = 1008\n",
      "i finished my job. cups = 1009\n",
      "\n",
      "\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import threading, time, logging\n",
    "\n",
    "FORMAT = \"%(asctime)s: %(threadName)s %(thread)d %(message)s\"\n",
    "logging.basicConfig(format=FORMAT, level=logging.INFO)\n",
    "\n",
    "cups = []\n",
    "lock = threading.Lock()\n",
    "\n",
    "def worker(count = 1000):\n",
    "    print(\"start worker\")\n",
    "    while True:\n",
    "        if len(cups) >= count:\n",
    "        #    lock.release()\n",
    "            break\n",
    "        time.sleep(0.0001)\n",
    "        lock.acquire()\n",
    "        cups.append(1)\n",
    "        lock.release()\n",
    "    print( \"i finished my job. cups = {}\\n\".format(len(cups)))\n",
    "\n",
    "for i in range(1,11):\n",
    "    threading.Thread(target=worker, args=(1000,), name=\"{}\".format(i)).start()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n",
      "start worker\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i finished my job. cups = 1000\n",
      "i finished my job. cups = 1000\n",
      "\n",
      "\n",
      "i finished my job. cups = 1000\n",
      "\n",
      "i finished my job. cups = 1000\n",
      "\n",
      "i finished my job. cups = 1000\n",
      "\n",
      "i finished my job. cups = 1000\n",
      "i finished my job. cups = 1000\n",
      "\n",
      "i finished my job. cups = 1000\n",
      "\n",
      "\n",
      "i finished my job. cups = 1000\n",
      "i finished my job. cups = 1000\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import threading, time, logging\n",
    "\n",
    "cups = []\n",
    "lock = threading.Lock()\n",
    "\n",
    "def worker(count = 1000):\n",
    "    print(\"start worker\")\n",
    "    while True:\n",
    "        with lock:\n",
    "            if len(cups) >= count:\n",
    "                break\n",
    "            time.sleep(0.0001)\n",
    "            cups.append(1)\n",
    "    print( \"i finished my job. cups = {}\\n\".format(len(cups)))\n",
    "\n",
    "for i in range(1,11):\n",
    "    threading.Thread(target=worker, args=(1000,), name=\"{}\".format(i)).start()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# queue的线程安全\n",
    "\n",
    "import queue\n",
    "\n",
    "q = queue.Queue(8)\n",
    "if q.qsize() == 7:\n",
    "    q. put()\n",
    "if q.qsize() == 1:\n",
    "   q.get()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多进程\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "calc-0 1\n",
      "calc-1 1\n",
      "calc-2 1\n",
      "calc-3 1\n",
      "0.112748\n",
      "calc-0 1\n",
      "calc-1 1\n",
      "calc-2 1\n",
      "calc-3 1\n",
      "===end====\n"
     ]
    }
   ],
   "source": [
    "import multiprocessing\n",
    "import datetime\n",
    "def calc(i):\n",
    "    sum = i\n",
    "\n",
    "    for _ in range(1000000000): # 10亿\n",
    "        sum += 1\n",
    "    \n",
    "    return i, sum\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    start = datetime.datetime.now() # 注意⼀定要有这⼀句\n",
    "    ps = []\n",
    "    for i in range(4):\n",
    "        p = multiprocessing.Process(target=calc, args=(i,), name='calc-{}'.format(i))\n",
    "        ps.append(p)\n",
    "        p.start()\n",
    "    for p in ps:\n",
    "        p.join()\n",
    "        print(p.name, p.exitcode)\n",
    "    delta = (datetime.datetime.now() - start).total_seconds()\n",
    "    print(delta)\n",
    "    for p in ps:\n",
    "        print(p.name, p.exitcode)\n",
    "    print('===end====')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "calc-0 1\n",
      "calc-1 1\n",
      "calc-2 1\n",
      "calc-3 1\n",
      "0.112748\n",
      "calc-0 1\n",
      "calc-1 1\n",
      "calc-2 1\n",
      "calc-3 1\n",
      "===end====\n"
     ]
    }
   ],
   "source": [
    "import multiprocessing\n",
    "import datetime\n",
    "def calc(i):\n",
    "    sum = i\n",
    "\n",
    "    for _ in range(1000000000): # 10亿\n",
    "        sum += 1\n",
    "    \n",
    "    return i, sum\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    start = datetime.datetime.now() # 注意⼀定要有这⼀句\n",
    "    ps = []\n",
    "    for i in range(4):\n",
    "        p = multiprocessing.Process(target=calc, args=(i,), name='calc-{}'.format(i))\n",
    "        ps.append(p)\n",
    "        p.start()\n",
    "    for p in ps:\n",
    "        p.join()\n",
    "        print(p.name, p.exitcode)\n",
    "    delta = (datetime.datetime.now() - start).total_seconds()\n",
    "    print(delta)\n",
    "    for p in ps:\n",
    "        print(p.name, p.exitcode)\n",
    "    print('===end====')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"a\" in \"abcd\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------------\n",
      "100000000\n",
      "100000200\n",
      "100000100\n",
      "<Future at 0x1dc2bf8b0d0 state=finished returned int> True 100000000\n",
      "<Future at 0x1dc2dd98220 state=finished returned int> True 100000100\n",
      "<Future at 0x1dc2dd737f0 state=finished returned int> True 100000200\n",
      "==============================\n",
      "0:00:07.819057\n"
     ]
    }
   ],
   "source": [
    "# future\n",
    "\n",
    "import concurrent.futures as ft\n",
    "import datetime\n",
    "\n",
    "def calc(base):\n",
    "    sum = base\n",
    "    for i in range (100000000):\n",
    "        sum+=1\n",
    "    \n",
    "    print(sum)\n",
    "    return sum\n",
    "\n",
    "start = datetime.datetime.now()\n",
    "\n",
    "executor = ft.ThreadPoolExecutor(3)\n",
    "\n",
    "\n",
    "with executor:\n",
    "    fs = []\n",
    "    for  i in range (3):\n",
    "        f = executor.submit(calc, i * 100)\n",
    "        fs.append(f)\n",
    "    \n",
    "    print('-'* 30)\n",
    "\n",
    "for f in fs :\n",
    "    print(f, f.done(), f.result())\n",
    "\n",
    "print('='* 30)\n",
    "\n",
    "delta = datetime.datetime.now() - start\n",
    "print(delta)\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1]\n",
      "[1, [2, 3, 4]]\n",
      "[1, [2, 3, 4], 5, 6, 7, 8]\n"
     ]
    }
   ],
   "source": [
    "l = []\n",
    "\n",
    "l.append(1)\n",
    "print(l)\n",
    "\n",
    "l.append([2,3,4])\n",
    "print(l)\n",
    "\n",
    "l.extend([5,6,7,8])\n",
    "print(l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
